{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Packages Loaded\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "Linear Regression with TensorFlow\n",
    "sungjoon.choi@cpslab.snu.ac.kr\n",
    "\"\"\"\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline  \n",
    "print (\"Packages Loaded\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      " Type of 'train_X' is  <class 'numpy.ndarray'>\n",
      " Shape of 'train_X' is (1, 20)\n",
      " Type of 'train_Y' is  <class 'numpy.ndarray'>\n",
      " Shape of 'train_Y' is (1, 20)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7ff521bd5f60>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt0XHW5//H3k7YUekkb6C0JNE0HwQoUinIpoCRHwkEs\nFJRSIEGiCByR4gVUqgxJGEE4q3jwsEQFkVQbQZADbQEXBErkBxKRIzeh9NB0mpakDQfoNQKnbZ7f\nH5mmSTqTTDqZTGbyea2Vxcye79772SR5uvN8v/v7NXdHREQyU1aqAxARkeRRkhcRyWBK8iIiGUxJ\nXkQkgynJi4hkMCV5EZEMllCSN7McM3vSzFaZ2RNmNi5Km5Fm9lcze9nM3jCzmxM5p4iIxC/RO/nr\ngKfc/XBgBbCwewN3/xgodvdZwEzgX8zs5ATPKyIicUg0yc8FFkdeLwbOidbI3f8ZeTkycs5NCZ5X\nRETikGiSn+TuLQDuvhGYFK2RmWWZ2cvARqDO3d9M8LwiIhKH4b01MLNaYHLnTYAD10dpHnWOBHdv\nA2aZWTbwpJmd6u5/3od4RUSkD3pN8u5eEuszM2sxs8nu3mJmU4B3eznWVjN7DPgMEDXJm5km0xER\n6SN3t2jbEy3XLAPKI68vAZZ2b2BmE3aPujGzA4AS4JWeDurug/qroqIi5THo+nR9ur7M+9rXa+tJ\nokn+VqDEzFYBnwduiSTzXDN7NNImF3gmUpOvB5a5+9MJnldEROLQa7mmJ+7+AXBalO0bgDmR168D\nxyZyHhER2Td64nUfFBUVpTqEpNL1pTddX/pKxrVZb/WcgWZmPthiEhEZzMwMT1LHq4iIDGJK8iIi\nGUxJXkQkgynJi4hkMCV5EZEMpiQvIpLBlORFRDKYkryISAZTkhcRyWBK8iIiGUxJXkQkgynJi4hk\nMCV5EZEMpiQvIpLBElo0REQknTWGw1QHg7Q1NZGVn095KERBYWGqw+pXmk9eRIakxnCYO0pKqGpo\nYDTQClQEAiyorU27RK/55EVEuqkOBjsSPMBooKqhgepgMJVh9buEkryZ5ZjZk2a2ysyeMLNxPbTN\nMrO/m9myRM4pItIf2pqaOhL8bqOBtubmVISTNIneyV8HPOXuhwMrgIU9tP0W8GaC5xMR6RdZ+fm0\ndtvWCmTl5aUinKRJNMnPBRZHXi8GzonWyMwOBs4Efp3g+URE+kV5KERFINCR6HfX5MtDoVSG1e8S\n6ng1sw/c/cBY7zttfxC4CRgHXOPuZ/dwTHW8isiA6Bhd09xMVl5e2o6u6anjtdchlGZWC0zuvAlw\n4PoozffKzmb2RaDF3V8xs6LI/iIiKVdQWEjFkiWpDiOpek3y7l4S6zMzazGzye7eYmZTgHejNDsZ\nONvMzgQOAMaa2W/d/SuxjltZWdnxuqioiKKiot7CFBEZMurq6qirq4urbaLlmluBD9z9VjP7AZDj\n7tf10P5UVK4RkUEiHG4kGKymqamN/PwsQqFyCgsLUh1WnyVUrunFrcADZvY1oBE4P3LCXOBud5+T\n4PFFRJIiHG6kpOQOGhqqIPI4VH19BbW1C9Iy0ceiJ15FZEgqK6uipuZa6DJavpXS0kUsWVKRqrD2\niZ54FRHppqmpDaI8DtXc3JaKcJJGSV5EhqT8/CyI8jhUXl5mpcXMuhoRkTiFQuUEAhXQ6XGoQKCC\nUKg8ZTElg2ryIjJk7R5d09zcRl5eZo6uUZIXEUlz6ngVERmilORFRDKYkryISAZTkhcRyWBK8iIi\nGUxJXkQkgynJi4hkMCV5EZEMpiQvIpLBlORFRDKYkryISAZTkhcRyWBK8iIiGUxJXkQkgyW0kLeZ\n5QB/AAqAtcD57r4lSru1wBagDdjh7scncl4RGZwaw2Gqg0HamprIys+nPBSioLAw1WENaQnNJ29m\ntwLvu/u/m9kPgBx3vy5KuzXAp919UxzH1HzyImmoMRzmjpISqhoaGE37eksVgQALamuV6JMsmfPJ\nzwUWR14vBs6JFUM/nEtEBrHqYLAjwUP7EtlVDQ1UB4OpDGvISzTxTnL3FgB33whMitHOgVoz+5uZ\nXZbgOUVkEGpraupI8LuNBtqam1MRjkT0WpM3s1pgcudNtCft66M0j1VnOdndN5jZRNqT/Up3fy7W\nOSsrKzteFxUVUVRU1FuYIpJiWfn5tEKXRN8KZOXlpSiizFVXV0ddXV1cbROtya8Eity9xcymAM+4\n+4xe9qkAtrn7T2N8rpq8SIrtXuC6qamN/Pz4FrhWTT51kraQd6Tj9QN3vzVWx6uZjQKy3H27mY0G\nngSq3P3JGMdUkhdJoXC4kZKSO2hoqIJIug4EKqitXRBXoq8OBmlrbiYrL0+jawZIMpP8gcADwCFA\nI+1DKDebWS5wt7vPMbNC4GHaSznDgRp3v6WHYyrJi6RQWVkVNTXX0r3wMvfsSmaN3aDhkYNQT0k+\noXHy7v4BcFqU7RuAOZHXYeCYRM4jIgOnqakNonSh/v3JV6n5qHZPKaa+XqWYNKBhjSLSRX5+Fu1p\nvLNWTvoorOGRaUhJXkS6CIXKmTr1h+xJ9K2MG3kpP2F1l3bRhkeGw42UlVVRXFxBWVkV4XDjQIQs\nPUioXCMimSeLNk73pWzjcd5lCpPYyK6sDXzUrV334ZHROmzr6+PrsJXkSajjNRnU8SqSWlVlZVxb\nU7PXePcLx4zhvu3bYw6PjNVhW1q6iCVLKgYs/qEoaR2vIpJ5Yj25OuXQw5i9+SC2bt6f7PEfcedv\nbujS6Rqrw7a5uS3JEUtPlORFpItoT66+Afxx9afYtP2X7Z9sbqX8axXU1h7SUYrZ02Hb9U4+L09d\nf6mk//si0kV5KERFINCp2xXOGzNrT4IHYDQNDVUEg9Ud+4VC5QQCFXTusA0EKgiFygckbolOd/Ii\n0kVBYSELamtZ1OnJ1fENeVDfcymmsLCA2toFBIOLaG5uIy8vi1BIna6ppo5XEemVOlUHt2TOJy8i\nQ4BKMelLd/IiEpfdM1PuKcX0PjOlDIykTVCWDEryIiJ9o3KNiMgQpSQvIpLBlORFRDKYkryISAZT\nkhcRyWBK8iIiGUxJXkQkgyWU5M0sx8yeNLNVZvaEmY2L0W6cmT1oZivN7A0zOyGR84qISHwSvZO/\nDnjK3Q8HVgALY7T7GfC4u88AjgZWJnheERGJQ0JPvJrZW8Cp7t5iZlOAOnf/ZLc22cDL7h6I85h6\n4lVEpA+SuTLUJHdvAXD3jWY2KUqbQuA9M7uX9rv4l4BvufuHCZ5bJGPsnhemqamN/HzNCyP9p9ck\nb2a1wOTOmwAHro/SPNot+HDgWOCb7v6Smd1Oe5kn5vyklZWVHa+LioooKirqLUyRtBVrAezq35zD\n03f9kramJrLy8ykPhbostydDV11dHXV1dXG1TbRcsxIo6lSueSZSd+/cZjLwgrtPj7w/BfiBu58V\n45gq18iQEmuu9k+O+SwvbX855sLZIrslc4KyZUB55PUlwNLuDSLlnPVmdlhk0+eBNxM8r0jGiLUA\n9qTtozsttgdVDQ1UB4MDG5ykvUST/K1AiZmtoj153wJgZrlm9mindlcDNWb2Cu11+ZsTPK9Ixtiz\nAHZnreTwDmUcSjGnUMahvAu0NTenIEJJZ5pPXiTFwuFGiop+yrp1N7O7Jj9mZCk5H8N6ajq2FVLK\nWXONnz3ycGoDlkEnmaNrRCRBWbRxui9lG4/zLlOYxEZesFGs4y/QqWATpoZGr0xhpJKOlORFUqw6\nGOT29Y2RdL4agM99dArrotTpt24bNcDRSbrT3DUiKdbW1LRXOp/KRqLV6fPy9CsrfaOfGJEUy8rP\n3yudL2Q1OWP+jT2JvpVAoIJQqHxAY5P0p45XkRRrDIe5o6SEqoaGLmPiz/lNNb+862mam9vIy9NT\nsBJbTx2vSvIig0BjOEx1MEhbczNZeXl6ulX6REleRCSDJfOJVxERGcSU5EVEMpiSvIhIBlOSFxHJ\nYEryIiIZTNMayJCmFZkk02kIpQxZ0VZkCgQqqK1doEQvaUXj5EWiaF+R6XzgAaCN9url+ZSWPsCS\nJTFXpxQZdDTVsEgUq1dvAu4B9tzJQwUNDTtTGpdIf1LHqwxZLS3r2ZPgify3io0b16cuKJF+piQv\nQ9aUKYcSbW3VKVMCqQhHJClUrpEhIdoomkBgFPX1rXRN9K0EAt0Tv0j6Sqjj1cxygD8ABcBa4Hx3\n39KtzWGRNg4YMB0Iuvt/xjimOl6lX8UaRfOb35zL1772sEbXSNpL2ugaM7sVeN/d/93MfgDkuPt1\nPbTPAt4BTnD3qIVPJXnpb+2jaK6l+x17aekiQqFygsFqzdkuaS2Zo2vmAqdGXi8G6oCYSR44DWiI\nleBFkqGpqY1otffm5jYKCws0XFIyWqIdr5PcvQXA3TcCk3ppPx+4L8FzivRJfn4WsdZLfej++/n8\nmDHMGz6cz48Zw0P335+KEEWSptc7eTOrBSZ33kR7ff36KM1j1lnMbARwNj3f6QNQWVnZ8bqoqIii\noqLedhGJKRQqp76+Yq/a+0nHFfDIhReybPfW1lb+7cILAfjyBRekLmCRXtTV1VFXVxdX20Rr8iuB\nIndvMbMpwDPuPiNG27OBK939jF6OqZq89Lvdo2s6196/ftQRLGtt7Vaph7NHj+bp7dtTFKlI3yWz\nJr8MKAduBS4BlvbQ9kJUqpEUiVZ7P/Cjj6JU6tu3i2SKRJP8rcADZvY1oBE4H8DMcoG73X1O5P0o\n2jtdL0/wfDLE7euskR0LZTc1kZWfT3koxAf7709rlDv5D/bfP1nhiww4TVAmaWNfZ41sDIe5o6SE\nqoaGPTPUBAIcumABz3/72/ySPTPX/Btwzn33qSYvaUULeUtGCAarOyV4gNE0NFQRDFb3uF91MNiR\n4InsXdXQQMvf/sY5993H2aNHM2/YMM4ePVoJXjKOpjWQtNHTePeetDU1Ra29tzU3c+wJs8k953sd\n5Z9jT5jdjxGLpJ6SvKSNPePdu1bR8/J6/oM0Kz8/yl6wOXvcXuWf+npNayCZReUaSRvtk4pVsOfB\npvaafChU3uN+5aEQFYFAp73aa/KNfug+lX9E0onu5CVtFBYWUFu7gGBwUafx7r3fdRcUFrKgtpZF\nwSBtzc1k5eWxIBSi/GvV7Ev5RySdKMlLWtnXuWYKCgupWLKky7Z9Lf+IpBP9NMuQta/lH5F0onHy\nMqRFm+5Ana6SbpI2n3wyKMlLT6I9uVpQWJjqsERSSkleMkKsJ1cX1NYq0cuQpideJSPEenK1OhhM\nZVgig5qSvKSNnp5cFZHolOQlbex+crWzViArLy8V4YikBSV5SRuxnlwtD4VSGZbIoKaOV0krHaNr\nIk+uanSNiEbXiIhkNI2uEREZojR3jaSUHm4SSS6VayRl9HCTSP9IWrnGzHLM7EkzW2VmT5jZuBjt\nFprZG2b2mpnVmNl+iZxXMoMebhJJvkRr8tcBT7n74cAKYGH3BmZWAFwGzHL3mbSXiLSIpujhJpEB\nkGiSnwssjrxeDJwTpc1W4P+A0WY2HBgF6LdY9HCTyABINMlPcvcWAHffCEzq3sDdNwG3AeuAJmCz\nuz+V4HklA+jhJpHk63V0jZnVApM7bwIcuD5K8716TM1sOvAdoADYAvzRzC5y99/HOmdlZWXH66Ki\nIoqKinoLU9JQrGX51Okq0rO6ujrq6uriapvQ6BozWwkUuXuLmU0BnnH3Gd3anA+UuPtlkfcXAye4\n+1UxjqnRNSIifZDMh6GWAeWR15cAS6O0WQWcaGb7m5kBnwdWJnheyRDhcCNlZVUUF1dQVlZFONyY\n6pBEMkqid/IHAg8AhwCNwPnuvtnMcoG73X1OpN33aP/HYBfwMvB1d98R45i6kx8iwuFGSkruoKGh\nCiIj5QOBCmprF2gJPpE+0Nw1MiiVlVVRU3MtdBlI2Upp6SKWLKlIVVgiaUdz18ig1NTUBlFGyjc3\nt6UiHJGMpCQvKZOfnwVRRsrn5enHUqS/6LdJUiYUKicQqIBOI+UDgQpCofKUxSSSaVSTl5QKhxsJ\nBqtpbm4jLy+LUKhcna4ifaSOVxGRDKaOVxGRIUpJXkQkgynJi4hkMC3/J11oOT6RzKKOV+nw/LPP\ncsMZZ9LyYS6tTOEINpJ7yA6u//MzSvQig5hG10ivGsNhrj3iKP77w9MIU8PuuWQOoZRz5xo/e+Th\nVIcoIjFodI30qjoYZNiHuZ0SPMBo1lPDivr3UhmaiCRANfkhrHP9Pfzmm7RwGNHmktneZc0YEUkn\nSvJDVGM4zB0lJVQ1NDAaCAL/RzbtUwx0nRXy6BNUjxdJVyrXDFHVwWBHggf4OjCa1RRSSue5ZPLz\nvs9/3B51ES8RSQO6kx+i2pqautyvFwA3AO8c9BdGDz+D7Uzm6BMK+Y/bv6+5ZETSmJL8EJWVn79X\nYWYCcNIZp1OxZEmKohKR/qYhlENU95p8K/DtQwr431nz2LJ1FPn5mhFSJF1onLxE1TG6prmZzdnj\neOTlqaxbdzNab1UkvSRtnLyZ5ZjZk2a2ysyeMLNxMdp9y8xej3xdncg5pWfPPfscMwtPZ9r4s5lZ\neDrPPftczLYFhYVULFlC1YoVvD/mmE4JHmA0DQ1VBIPVAxG2iCRJoqNrrgOecvfDgRXAwu4NzOwI\n4FLgM8AxwBwzm57geSWKB+9/gH8t+imvr32Yxi3LeH3tw8z5/M96TPS7ab1VkcyUaJKfCyyOvF4M\nnBOlzQzgr+7+sbvvAp4FvpTgeaWbxnCY6y6u5J/+OzrfjW/ZWc2Vl9wYdZ9wuJGysiqKiytYu/Yf\naL1VkcyT6OiaSe7eAuDuG81sUpQ2/wB+bGY5wMfAmcDfEjyvdFMdDJK/8yDWRLkb37Z5/73ah8ON\nlJTcQUNDFe3/KKxk+PBvsnPnz+lckw+FFiQ/eBFJml6TvJnVQpfn2g1w4PoozffqMXX3t8zsVqAW\n2A68DOzq6ZyVlZUdr4uKiigqKuotzCGvramJqWwk2hOrY8d/tFf7YLC6U4IHmMHOnT9g2rSvUFh4\nZGS9VXW6igxGdXV11NXVxdU2odE1ZrYSKHL3FjObAjzj7jN62ecmYL27/zLG5xpdsw+qyso4r6aG\nucylodMskqPsYp6o+y6nfO6ULu2Liyuoq6va6zjFxRWsWLH3dhEZvJI5C+UyoDzy+hJgaYwAJkb+\nOxU4F/h9gufNaJ1r5WVlVYTDjb3uUx4KcW8gwFKWUsoxfI7PMn34cVT//oK9EjxAfn4WqsGLZL5E\n7+QPBB4ADgEagfPdfbOZ5QJ3u/ucSLtngQOBHcB33L2uh2MO6Tv5vWvl8Y9X7zzuPSsvr8dVnRI5\nj4gMLj3dySfU8eruHwCnRdm+AZjT6f3nEjnPULJ3rXz3ePVFLFlS0eO+bWTxNp+gyQPkk0VbD3+o\nFRYWUFu7gGBwEc3NbarBi2QozV0zyOzrePVod+b19T3fmRcWFvT6D4eIpDcVYAeZfa2Vx/4LoLr/\ngxSRtKEkP8iEQuVMnfpDOs/pPnXqDwmFynvcT0+sikg0KtcMMlm0cbovZRuP8y5TmMRGxvoOsvh2\nj/vt+Qug6xh5jZbJbNOmTaOxsffRV5IZCgoKWLt2bZ/20SyUg0xVWRnX1tR0S9WwqLS0x3neNVpm\naIqMqkh1GDJAYn2/kza6Rvpf9xWboD1ltzU397ifRsuISDRK8oNMtBWbWoGsvLxe99VoGRHpTgXb\nQaY8FKIiEOjU7QoVgQDloVAqwxKRNKWa/CDUlydXZWhTTX5o2ZeavJK8SBrL1CT/k5/8hHA4zF13\n3dWvbXuTlZXF6tWrmT6993WNqqqqWL16Nb/73e8SPm+89iXJq1wjIklVXV3NzJkzGT16NHl5eVx5\n5ZVs2bKlx30WLlwYd9LuS9vemEXNkwm3/+pXv8oNN9ywLyElTEleJEM1hsNUlZVRUVxMVVkZjeHw\ngB/jtttuY+HChdx2221s3bqV+vp6GhsbKSkpYefOnVH32bWrx+UmkioT/yrC3QfVV3tIIhKPWL8v\na9es8WsCAd8O7uDbwa8JBHztmjVxHzvRY2zdutXHjBnjf/zjH7ts3759u0+cONHvvfded3evrKz0\n8847z8vKynzcuHF+zz33eGVlpZeVlXXss3jxYi8oKPAJEyZ4KBTyadOm+dNPP92x/+62a9eudTPz\nxYsX+9SpU33ixIl+0003dRznxRdf9NmzZ/v48eM9Ly/Pr7rqKt+xY0fH52bmDQ0NUa8nHA77qaee\n6tnZ2X766af7VVdd5RdffHHH5/PmzfMpU6b4+PHj/dRTT/U333zT3d3vuusuHzFihI8cOdLHjh3r\nZ599tru733LLLR4IBHzs2LF+xBFH+MMPP9zr/9NY3+/I9qg5VXfyIhmoOhikqqGh00xGUNXQQHUw\nOGDH+Mtf/sLHH3/Mueee22X76NGjOfPMM6mtre3YtmzZMs4//3w2b97MRRddBOwphbz55pt885vf\n5L777mPDhg1s2bKF5m7PjXQvmzz//PO8/fbbPPXUU9x4442sWrUKgGHDhnH77bfzwQcf8MILL7Bi\nxQruvPPOuK7noosu4rjjjuO9997j+uuvZ/HixV0+P/PMM2loaODdd9/l2GOP7biOyy67jNLSUr7/\n/e+zdetWli5tX3bj0EMP5fnnn2fr1q1UVFRQVlZGS0tLXLH0hZK8SAba14fq+vMY7733HhMmTCAr\na+80k5uby3vvvdfxfvbs2Zx11lkA7L9/1zWJH3roIc4++2xmz57N8OHDufHG6AvT72ZmVFZWst9+\n+zFz5kyOPvpoXn31VQCOPfZYjj/+eMyMqVOncvnll/PnP/+512tZv349L730EjfeeCMjRozgs5/9\nbEe8u5WXlzNq1ChGjBjBDTfcwKuvvsq2bdtiHvPLX/4ykye3r6w6b948PvGJT/Diiy/2GktfKcn3\no/6ogYr0h90P1XUW70N1/XWMCRMm8N5779HWtvckeRs2bGDChAkd7w855JCYx2lubu7y+QEHHMBB\nBx3U47l3J0+AUaNGsX37dgDefvttzjrrLHJzcxk/fjw/+tGPuvxj01MMOTk5HHDAAR3bCgr2PE3e\n1tbGddddx6GHHsr48eMpLCzEzHo89m9/+1tmzZpFTk4OOTk5vPHGG3HF0ldK8v2kMRzmjpISrq2p\noaqujmtrarijpESJXlKiPx6qS/QYs2fPZuTIkfzXf/1Xl+3bt2/nT3/6E6edtme9oZ5GqeTm5vLO\nO+90vP/www95//33476Ozr7xjW8wY8YMGhoa2Lx5MzfddFNcna25ubls2rSJDz/8sGPbunXrOl7X\n1NSwfPlyVqxYwebNm1m7dm3nfsa9rm/dunVcfvnl3HnnnWzatIlNmzZxxBFHJKXjV0m+n1QHg3y1\noYErOJRiTuEKDuWrfayBivSXgsJCFtTWtk9sV1zMotJSFtTW9umhukSPkZ2dzQ033MCCBQt44okn\n2LlzJ2vXrmX+/PlMnTqVsrKyuI5z3nnnsXz5curr69mxYweVlZU9tu8pUW7bto3s7GxGjRrFW2+9\nxS9+8Yu4Ypg6dSqf+cxnqKioYMeOHTz33HMsX7684/Pt27czcuRIcnJyaG1tZeHChV0S++TJk1mz\nZk3H+9bWVrKyspgwYQJtbW3ce++9/OMf/4grlr5KKMmb2Xlm9g8z22Vmx/bQ7gwze8vM/sfMfpDI\nOQer91evYS5zqeEV6vh/1PAKc5nL+w1ret9ZJAkKCgupWLKEqhUrqFiyZJ+emk70GN/73ve4+eab\nufbaaxk3bhyzZ8+moKCAp556ihEjRsR1jE996lPccccdzJ8/n7y8PLKzs5k0aRIjR46M2r77XXPn\n94sWLaKmpobs7GyuuOIKLrjggh737ez3v/899fX1HHTQQYRCIS655JKOz77yla8wdepU8vPzOfLI\nIznppJO67HvppZfyxhtvcOCBB/KlL32JGTNm8N3vfpcTTzyRKVOm8MYbb3DKKafE9f+jrxJdyPtw\noA34FXCtu/89Spss4H+AzwPNwN+AC9z9rRjH9GT8yZJsMwtP5/W1D9N9arGjpp3La+EnUxWWZLhM\nfeK1J62trYwfP57Vq1d3qYsPBQP+xKu7r3L3t4GeHvs6Hnjb3RvdfQdwPzA3kfOmSk8dq6OnHEO0\nlZnGTDlmQGMUyUSPPvooH374Ia2trVxzzTXMnDlzyCX4fTUQNfl8YH2n9+9EtqWVxnCYH59azMqa\nv/Js3U5W1vyVH59a3JHoA4H2hTq6amV6oHviF5G+Wrp0KXl5eRx88ME0NDRw//33pzqktNFrucbM\naoHJnTcBDvzI3ZdH2jwDXBOjXPNl4F/d/fLI+zLgeHe/Osb5BmW55lvnnMvypU6YGnavvFRIKWfN\nNX72yMNamUlSYiiWa4aypKwM5e4lCcbVBEzt9P7gyLaYOveeFxUVUVRUlGAIiVvxwv8S5gno9Pxf\nmBpW1J8BaGUmERk4dXV11NXVxdW2X6YajtzJX+vu/x3ls2HAKto7XjcALwIXuvvKGMcalHfyhZPn\nsfbdB/faPm3yeYQ3/jEFEYnoTn6oGfCOVzM7x8zWAycCj5rZnyLbc83sUQB33wVcBTwJvAHcHyvB\nD2ZHnziNaDX3o0/QYh4iMnhp0ZA4hcONFBX9lHXrbmZ3zX3q1B9SV/ddlWQkZXQnP7RoZagkC4cb\nCQarO9Xcy5XgJaWU5IcWJXmRIWYoJfm2tjbGjRvHypUrOfjgg/utbaKefvppvv71rxMegHmqtPyf\niAwaY8eOJTs7m+zsbIYNG8aoUaM6tt133319Pl5WVhbbtm2LK2n3pW1/iHcZwHvuuYfi4uIkR9NV\nr0MoRSQ97S4vNjW1kZ+/b+XFRI7ReS716dOn95rgdu3axbBhw/oUX7px9z6vI9svJx1MX2j5P5G4\nxfp9WbNmrQcC1zhs9/bV+7Z7IHCNr1mzNu5j98cxduu8XN9u119/vc+fP98vvPBCz87O9sWLF/sL\nL7zgJ554YsfyfFdffbXv3LnT3d137tzpZuaNjY3u7l5WVuZXX321f+ELX/CxY8f6SSed5GvXru1z\nW3f3xx/GDP5PAAAIv0lEQVR/3A877DAfP368L1iwwE8++WRfvHhx1Gv55z//6WVlZZ6Tk+NHHnmk\n33rrrV5YWNjx+Y9//GOfPn26jx071o888khftmyZu7u//vrrvv/++/vw4cN9zJgxPnHiRHd3X7Zs\nmR9zzDGenZ3tBQUFHgqFYv5/jPX9pofl/1Ke1PcKSEleJG6xfl9KSys7JWfvSNKlpZVxH7s/jrFb\nrCQ/cuRIf+yxx9zd/aOPPvKXXnrJX3zxRW9ra/NwOOyHH364//znP3f39sSdlZXVJXFPnDjR//73\nv/vOnTt9/vz5HWuu9qVtS0uLjx071pcvX+47d+70n/70p77ffvvFTPLXXHONFxcX+5YtW3zdunX+\nqU99qkuSf/DBB72lpcXd3e+77z4fM2aMv/vuu+7u/utf/9qLi4u7HO+ZZ57pWA/2tdde84kTJ3b8\nP+luX5K8avIiGaipqY1oE+Y1N++9SlMyj9GbU045hTPPPBOAkSNH8ulPf5rjjjsOM2PatGlcdtll\nXZbn826djueddx6zZs1i2LBhlJaW8sorr/S57WOPPcasWbOYM2cOw4YN4zvf+U6PK089+OCDBINB\nsrOzOeSQQ7jqqqv2Os+kSZMAuOCCC5g2bRovvfRSzOMVFRUxY8YMAI466ijmz58f15KE8VKSF8lA\n+flZRHt4Ly8v/l/5/jhGb7ov+7dq1SrmzJlDbm4u48aNo6Kioscl8aZMmdLxuvMyf31p2315QaDH\nDtsNGzZ0+bz7bJjV1dUcc8wxHHjggeTk5LBq1aoer+GFF16guLiYSZMmMX78eO65555+XQZQSV4k\nA4VC5QQCFdBp8b5AoIJQqHxAj9Gb7p2QV1xxBUcddRRr1qxhy5YtVFVVJX2IaG5uLuvXr++yrakp\n9vRa3ds3NjZ2vA6Hw1x55ZX86le/4oMPPmDTpk0cfvjhHdcQrdP1wgsvZN68eTQ1NbF582YuvfTS\nfr1mJXmRDLR7wrzS0kUUF1dQWrqozzOi9scx+mrbtm2MGzeOAw44gJUrV/KrX/0qaefabc6cObz8\n8ss89thj7Nq1i9tvv73HO+l58+Zx8803s2XLFtatW8fPf/7zjs+2b9/esazfrl27uPvuu3nrrT3r\nI02ePJl33nmHnTt3dtknJyeHESNGUF9f3+/TKCvJi2SowsICliypYMWKKpYsqdin5Nwfx4D4x5Hf\ndtttVFdXk52dzTe+8Y0el+fr7Zjxtp00aRJ/+MMf+M53vsOECRMIh8PMmjUr5vKCVVVVTJkyhWnT\npvHFL36xyzKARx11FAsWLOC4444jLy+Pt99+mxNPPLHj85KSEj7xiU8wefJk8vLyALjzzju57rrr\nGDduHLfccgvz58/v8br6Sk+8iqSxofTE60Bpa2sjLy+Phx56iJNPPjnV4XShJ15FRPbBE088wZYt\nW/j444+58cYb2W+//Tj++ONTHVa/UJIXkSHvueeeY/r06UyePJna2loeeeQRRowYkeqw+oXKNSJp\nTOWaoUXlGhER6UJJXkQkgynJi4hkME01LJLGCgoKBn7qWkmZ7lMoxCOhjlczOw+oBGYAx7n732O0\nuweYA7S4+8xejqmOVxGRPkhmx+vrwLlAb1Om3Qv8a4LnGjTq6upSHUJS6frSm64vfSXj2hJK8u6+\nyt3fBnr8e9HdnwM2JXKuwSSTf8hA15fudH3pa9AleRERGdx67Xg1s1pgcudNgAM/cvflyQpMREQS\n1y9PvJrZM8A1sTpeI20KgOXxdLwmHJCIyBATq+O1P4dQ9jaOy+JoEzNQERHpu4Rq8mZ2jpmtB04E\nHjWzP0W255rZo53a/R74C3CYma0zs68mcl4REYnPoJugTERE+o9G1/TAzM4ws7fM7H/M7Acx2vyn\nmb1tZq+Y2TEDHWMiers+M7vIzF6NfD1nZkelIs59Fc/3L9LuODPbYWZfGsj4EhHnz2aRmb1sZv+I\n9JuljTh+Ng8ysz9Ffu9eN7PyFIS5z8zsHjNrMbPXemjTP7nF3fUV5Yv2fwBXAwXACOAV4JPd2nwB\neCzy+gSgPtVx9/P1nQiMi7w+I9Our1O7p4FHgS+lOu5+/N6NA94A8iPvJ6Q67n6+vgrgJ7uvDXgf\nGJ7q2PtwjacAxwCvxfi833KL7uRjOx54290b3X0HcD8wt1ubucBvAdz9r8A4M5tMeuj1+ty93t23\nRN7WA/kDHGMi4vn+ASwA/gi8O5DBJSiea7sIeMjdmwDcPfbK1INPPNe3ERgbeT0WeN/dd5ImvPcH\nRPsttyjJx5YPrO/0/h32TnLd2zRFaTNYxXN9nX0d+FNSI+pfvV6fmeUB57j7L4hj5NcgEs/37jDg\nQDN7xsz+ZmYXD1h0iYvn+u4GjjCzZuBV4FsDFNtA6bfcolkopVdmVgx8lfY/MTPJ7UDnem86Jfre\nDAeOBf4FGA28YGYvuPvq1IbVbxYCr7p7sZkFgFozm+nu21Md2GCjJB9bEzC10/uDI9u6tzmklzaD\nVTzXh5nNBO4CznD3dJp/KJ7r+wxwv7XP1TsB+IKZ7XD3ZQMU476K59reAd5z94+Aj8zsWeBo2mvd\ng10813cycBOAuzeYWRj4JPDSgESYfP2WW1Suie1vwKFmVmBm+wEXAN1/+ZcBXwEwsxOBze7eMrBh\n7rNer8/MpgIPARe7e0MKYkxEr9fn7tMjX4W01+WvTIMED/H9bC4FTjGzYWY2ivbOu5UDHOe+iuf6\nVgKnAURq1YcBawY0ysT19IBov+UW3cnH4O67zOwq4Ena/zG8x91XmtkV7R/7Xe7+uJmdaWargVba\nSxppIZ7rA4LAgcCdkbvdHe5+fOqijl+c19dllwEPch/F+bP5lpk9AbwG7ALucvc3Uxh23OL83v0E\nuNfMXqU9UX7f3T9IXdR9E3lAtAg4yMzW0T5aaD+SkFv0MJSISAZTuUZEJIMpyYuIZDAleRGRDKYk\nLyKSwZTkRUQymJK8iEgGU5IXEclgSvIiIhns/wMmkprkEKIZEwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff521c64c50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Generate training data\n",
    "np.random.seed(1)\n",
    "def f(x, a, b):\n",
    "    n    = train_X.size\n",
    "    vals = np.zeros((1, n))\n",
    "    for i in range(0, n):\n",
    "        ax  = np.multiply(a, x.item(i))\n",
    "        val = np.add(ax, b)\n",
    "        vals[0, i] = val\n",
    "    return vals\n",
    "\n",
    "Wref = 0.7\n",
    "bref = -1.\n",
    "n    = 20\n",
    "noise_var = 0.001\n",
    "train_X   = np.random.random((1, n))\n",
    "ref_Y     = f(train_X, Wref, bref)\n",
    "train_Y   = ref_Y + np.sqrt(noise_var)*np.random.randn(1, n)\n",
    "n_samples = train_X.size # <= Just for using size operator \n",
    "print (\"\")\n",
    "print (\" Type of 'train_X' is \", type(train_X))\n",
    "print (\" Shape of 'train_X' is %s\" % (train_X.shape,))\n",
    "print (\" Type of 'train_Y' is \", type(train_Y))\n",
    "print (\" Shape of 'train_Y' is %s\" % (train_Y.shape,))\n",
    "\n",
    "# Plot\n",
    "plt.figure(1)\n",
    "plt.plot(train_X[0, :], ref_Y[0, :], 'ro', label='Original data')\n",
    "plt.plot(train_X[0, :], train_Y[0, :], 'bo', label='Training data')\n",
    "plt.axis('equal')\n",
    "plt.legend(loc='lower right')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Prepare for Linear Regression\n",
    "\n",
    "# Parameters \n",
    "training_epochs = 2000\n",
    "display_step    = 50\n",
    "\n",
    "\n",
    "# Set TensorFlow Graph\n",
    "X = tf.placeholder(tf.float32, name=\"input\")\n",
    "Y = tf.placeholder(tf.float32, name=\"output\")\n",
    "W = tf.Variable(np.random.randn(), name=\"weight\")\n",
    "b = tf.Variable(np.random.randn(), name=\"bias\")\n",
    "\n",
    "# Construct a Model\n",
    "activation = tf.add(tf.mul(X, W), b)\n",
    "\n",
    "# Define Error Measure and Optimizer\n",
    "learning_rate   = 0.01\n",
    "cost = tf.reduce_mean(tf.pow(activation-Y, 2))\n",
    "# learning_rate   = 0.001\n",
    "# cost = tf.sqrt(tf.reduce_sum(tf.pow(activation-Y, 2)))\n",
    "optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #Gradient descent\n",
    "\n",
    "\"\"\"\n",
    " tf.reduce_sum()\n",
    " tf.reduce_mean()\n",
    " _____\n",
    "\n",
    " tf.pow(Yhat, Y, 2)\n",
    " tf.nn.softmax_cross_entropy_with_logits(Yhat, Y)\n",
    " _____\n",
    "\n",
    " tf.train.GradientDescentOptimizer(0.05).minimize(cost)\n",
    " tf.train.RMSPropOptimizer(0.001, 0.9).minimize(cost)\n",
    "\"\"\"\n",
    "\n",
    "# Initializer\n",
    "init = tf.initialize_all_variables()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 0001 cost= 0.21532\n",
      " Wtemp is -0.6964 btemp is -0.1715\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0051 cost= 0.01696\n",
      " Wtemp is 0.1656 btemp is -0.7954\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0101 cost= 0.00264\n",
      " Wtemp is 0.5047 btemp is -0.9280\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0151 cost= 0.00083\n",
      " Wtemp is 0.6247 btemp is -0.9750\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0201 cost= 0.00060\n",
      " Wtemp is 0.6672 btemp is -0.9916\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0251 cost= 0.00057\n",
      " Wtemp is 0.6823 btemp is -0.9975\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0301 cost= 0.00057\n",
      " Wtemp is 0.6876 btemp is -0.9996\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0351 cost= 0.00056\n",
      " Wtemp is 0.6895 btemp is -1.0003\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0401 cost= 0.00056\n",
      " Wtemp is 0.6901 btemp is -1.0006\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0451 cost= 0.00056\n",
      " Wtemp is 0.6904 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0501 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0551 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0601 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0651 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0701 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0751 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0801 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0851 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0901 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 0951 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1001 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1051 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1101 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1151 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1201 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1251 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1301 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1351 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1401 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1451 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1501 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1551 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1601 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1651 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1701 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1751 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1801 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1851 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1901 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n",
      "Epoch: 1951 cost= 0.00056\n",
      " Wtemp is 0.6905 btemp is -1.0007\n",
      " Wref is 0.7000 bref is -1.0000\n"
     ]
    }
   ],
   "source": [
    "# Run! \n",
    "sess = tf.Session()\n",
    "# Initialize\n",
    "sess.run(init)    \n",
    "for epoch in range(training_epochs):\n",
    "    for (x, y) in zip(train_X[0, :], train_Y[0, :]):\n",
    "        # print \"x: \", x, \" y: \", y\n",
    "        sess.run(optimizer, feed_dict={X:x, Y:y})\n",
    "    \n",
    "    # Check cost\n",
    "    if epoch % display_step == 0:\n",
    "        costval = sess.run(cost, feed_dict={X: train_X, Y:train_Y})\n",
    "        print (\"Epoch:\", \"%04d\"%(epoch+1), \"cost=\", \"{:.5f}\".format(costval))\n",
    "        Wtemp = sess.run(W)\n",
    "        btemp = sess.run(b)\n",
    "        print (\" Wtemp is\", \"{:.4f}\".format(Wtemp), \"btemp is\", \"{:.4f}\".format(btemp))\n",
    "        print (\" Wref is\", \"{:.4f}\".format(Wref), \"bref is\", \"{:.4f}\".format(bref))\n",
    "        \n",
    "# Final W and b\n",
    "Wopt = sess.run(W)\n",
    "bopt = sess.run(b)\n",
    "fopt = f(train_X, Wopt, bopt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7ff520245b00>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nk0rWlYP562uv2sxMJiysuaZtCUlzjaqODTKuUqC/x/LJrnV+5ebmup+npaWRlpYWZAjBW77yPzhY\nRk17exZwP/vpw/JVlwLHeyJkZ8+krMxJYmIU+fmW4I0xTa+wsJDCwsKAyjbJUMOumvw0Vf23j23R\nwEZqLrxuAz4BrlPV9X721SJr8ikJ49i846UT1g9IuBbH9kVhiMgYq8m3Nc0+M5SIXCUiW4ERwBIR\necu1vq+ILAFQ1aPAJOAd4Ctgob8E35KdO2IAvtrczx1uk3kYY1oumzQkQA5HCWlpj7BlywMca3Pv\n3/8+Cgt/Z00yJmysJt+22MxQIXZsbO3jbe4NH5/bmKZkSb5tsSRvTBvTWpP81q1bOeuss9i3b1/I\nxnX65S9/Sb9+/fjjH//YoNdddtllXHfdddxwww0hiSsYzd4mb4wxdRkwYACxsbHEx8cTFxdHfHw8\n27dvp1+/fuzfv9+d4NPT03n22We9XhsVFUVxcWiGBZk3bx6jR4/2ue3NN99skQm+sSzJG2NCRkRY\nunQp+/fv58CBA+zfv99ryN/6Xhvq2NoCS/LGmJDy1bxQUlJCVFQUTqeT+++/nw8++IBJkyYRHx/P\nlClTGDNmDKrKOeecQ3x8PC+9VNN9ecmSJQwZMoRu3boxatQo1q1b597n2rVrGTp0KF27dmXChAkc\nPny4UfF6/qo4VuO/66676N69O6mpqbz99tvusvv37+eWW24hMTGRfv36kZ2d3eKazyzJG2PC4lhN\n+k9/+hOjR4/mb3/7G/v37+fxxx93z4y0bt069u/fz7hx41i7di0333wzs2fPZvfu3dx2221cccUV\nVFVVUVVVxdVXX83EiRPZvXs348aN4+WXX26SOD/55BPOOOMMdu3axV133cXNN9/s3jZx4kQ6dOhA\ncXExa9eupaCggH/84x9NctymYknemAgnIk3yaKyrrrqK7t270717d37+85836LWeteLZs2fz61//\nmvPPPx8R4YYbbiAmJoZVq1axatUqqqurmTJlCtHR0VxzzTUMGzas0TF7Sk5O5qabbkJEmDhxItu2\nbWPHjh3s2LGDt956i0cffZSOHTvSs2dP7rjjDl544YUmOW5Tsen/jIlw4W4+eP3110lPTw96PyUl\nJTz33HPMmjULqDmvqqoqysrKAEhK8h73sPa0fI3leQ2hU6dOQM1EH7t27aKqqoq+ffu641FV+vfv\n73M/4WJJ3hgTUoH8kQnkl0K/fv34wx/+wL333nvCtvfff/+EKfu2bNnCKaecEnigDdSvXz86duzI\nrl27WvRFXGuuMcaEhWfyT0hIOKG7ZJ8+fbzW/epXv+Lvf/87n3zyCQCVlZW8+eabVFZWMnLkSNq1\na8esWbOorq7mlVdecZfzx+l08v3333s9GqJPnz5ccskl3HnnnRw4cABVpbi4mPfff79B+wk1S/LG\nmJCpq4brue3222/npZdeokePHtxxxx0A5OTkcOONN9K9e3cWLVrE0KFDmT17NpMmTaJ79+6cdtpp\nzJs3D4D27dvzyiuvMGfOHHr06MFLL73ENddcU2dsK1euJDY2ltjYWDp16kRsbCxOp7NB0wo+99xz\nHDlyhDPPPJPu3bszbtw4tm/fXu//S3OyO16NacVa6x2vpnHsjldjjDFeLMkbY0wEsyRvjDERzJK8\nMcZEMEvyxhgTwSzJG2NMBLM7Xo1pxZKTk1v03ZamaTVmqIag+smLyLVALnAGMExV1/gp9wxwOVCu\nqufUs0/rJ2+MMQ0Qyn7y64CrgffqKTcH+EmQx2oxCgsLwx1CSNn5tW52fq1XKM4tqCSvqhtV9Vug\nzt+LqvohsCeYY7UkkfwhAzu/1s7Or/VqcUneGGNMy1bvhVcRKQASPFcBCvxBVd8IVWDGGGOC1yQD\nlInICmCqvwuvrjLJwBuBXHgNOiBjjGlj/F14bcoulPX145IAyvgN1BhjTMMF1SYvIleJyFZgBLBE\nRN5yre8rIks8yj0PfAScJiJbROSXwRzXGGNMYFrcePLGGGOajvWuqYOIXCoiG0TkGxG520+Zx0Xk\nWxH5TETOa+4Yg1Hf+YnI9SLyuevxoYgMDkecjRXI++cqN0xEqkTk580ZXzAC/GymichaEfnSdd2s\n1Qjgs9lDRN5yfe/WiUhWGMJsNBF5RkTKReSLOso0TW45NsO4Pbwf1PwB3AQkA+2Bz4DTa5X5KbDU\n9Xw4sCrccTfx+Y0AurqeXxpp5+dR7l1gCfDzcMfdhO9dV+ArIMm13DPccTfx+eUADx47N2AX0C7c\nsTfgHEcB5wFf+NneZLnFavL+XQB8q6olqloFLASurFXmSuA5AFX9GOgqIgm0DvWen6quUtV9rsVV\nQFIzxxiMQN4/gMnAImBHcwYXpEDO7XrgZVUtBVDVnc0cYzACOb/tQJzreRywS1WrmzHGoGj9N4g2\nWW6xJO9fErDVY/k7TkxytcuU+ijTUgVyfp5uAd4KaURNq97zE5FE4CpV/V8C6PnVggTy3p0GdBeR\nFSLyqYjc0GzRBS+Q85sNnCUiZcDnwO3NFFtzabLcYqNQmnqJSDrwS2p+YkaSxwDP9t7WlOjr0w74\nAfAjoDOwUkRWquqm8IbVZO4FPlfVdBFJBQpE5BxVrQh3YC2NJXn/SoH+Hssnu9bVLtOvnjItVSDn\nh4icAzwNXKqqrWn8oUDO73xgodSM1dsT+KmIVKnq4maKsbECObfvgJ2qehg4LCLvA+dS09bd0gVy\nfhcCfwZQ1SIRcQCnA6ubJcLQa7LcYs01/n0KnCIiySLSAZgA1P7yLwZuBBCREcBeVS1v3jAbrd7z\nE5H+wMvADapaFIYYg1Hv+anqQNcjhZp2+d+2ggQPgX02XwdGiUi0iMRSc/FufTPH2ViBnN964McA\nrrbq04DiZo0yeHXdINpkucVq8n6o6lERmQS8Q80fw2dUdb2I3FazWZ9W1TdF5DIR2QRUUtOk0SoE\ncn5ANtAdeNJV261S1QvCF3XgAjw/r5c0e5CNFOBnc4OILAO+AI4CT6vq12EMO2ABvncPAnNE5HNq\nEuXvVXV3+KJuGNcNomlADxHZQk1voQ6EILfYzVDGGBPBrLnGGGMimCV5Y4yJYJbkjTEmglmSN8aY\nCGZJ3hhjIpgleWOMiWCW5I0xJoJZkjfGmAj2/wELhoOPPTsloAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff521c54e10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot Results\n",
    "plt.figure(2)\n",
    "plt.plot(train_X[0, :], ref_Y[0, :], 'ro', label='Original data')\n",
    "plt.plot(train_X[0, :], train_Y[0, :], 'bo', label='Training data')\n",
    "plt.plot(train_X[0, :], fopt[0, :], 'k-', label='Fitted Line')\n",
    "plt.axis('equal')\n",
    "plt.legend(loc='lower right')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.4.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
